home *** CD-ROM | disk | FTP | other *** search
/ Aminet 31 / Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso / Aminet / dev / gui / gtlayout.lha / Source / LTP_LevelClass.c < prev    next >
C/C++ Source or Header  |  1998-09-09  |  29KB  |  1,329 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1998 by Olaf `Olsen' Barthel
  5. **        Freely distributable.
  6. **
  7. **    :ts=4
  8. */
  9.  
  10. #ifndef _GTLAYOUT_GLOBAL_H
  11. #include "gtlayout_global.h"
  12. #endif
  13.  
  14. /*****************************************************************************/
  15.  
  16. #include <graphics/gfxmacros.h>
  17.  
  18. #include <clib/alib_protos.h>    /* For Coerce/Do/DoSuperMethod */
  19.  
  20. #include <stdarg.h>
  21.  
  22. /*****************************************************************************/
  23.  
  24. #include "Assert.h"
  25.  
  26. #ifdef DO_LEVEL_KIND    /* Support code */
  27.  
  28.  
  29. /*****************************************************************************/
  30.  
  31. #define FAILED (0)
  32.  
  33. /*****************************************************************************/
  34.  
  35.  
  36. STATIC VOID
  37. SliderCleanup(struct SliderClassData *sd)
  38. {
  39.     LONG i;
  40.  
  41.     WaitBlit();
  42.  
  43.     for(i = 0 ; i < sd->ThumbBitMap.Depth ; i++)
  44.     {
  45.         if(sd->ThumbBitMap.Planes[i] != NULL)
  46.         {
  47.             FreeRaster(sd->ThumbBitMap.Planes[i],sd->ThumbWidth * 2,sd->ThumbHeight);
  48.             sd->ThumbBitMap.Planes[i] = NULL;
  49.         }
  50.     }
  51. }
  52.  
  53. /****************************************************************************/
  54.  
  55. #define SCALE_UP(a)        ((a) * dri->dri_Resolution.Y)/dri->dri_Resolution.X
  56. #define SCALE_DOWN(a)    ((a) * dri->dri_Resolution.X)/dri->dri_Resolution.Y
  57.  
  58. /****************************************************************************/
  59.  
  60. LONG
  61. LTP_QuerySliderSize(struct DrawInfo *dri,WORD Reference,WORD freedom,WORD useTicks)
  62. {
  63.     LONG thumbWidth,thumbHeight,separatorSpace,pipSpace,result;
  64.  
  65.     if(Reference == 0)
  66.         Reference = dri->dri_Font->tf_YSize;
  67.  
  68.     thumbHeight = (Reference + 1) & ~1;
  69.  
  70.     if(thumbHeight < 8)
  71.         thumbHeight = 8;
  72.  
  73.     thumbWidth = (((thumbHeight * 1618) / 1000) + 1) & ~1;
  74.  
  75.     if(thumbWidth < 8)
  76.         thumbWidth = 8;
  77.  
  78.     thumbHeight = SCALE_DOWN(thumbHeight);
  79.  
  80.     if(thumbHeight < 8)
  81.         thumbHeight = 8;
  82.  
  83.     if(freedom == FREEVERT)
  84.     {
  85.         separatorSpace    = 2;
  86.         pipSpace        = SCALE_UP(4);
  87.  
  88.         if(useTicks != TICKS_None)
  89.         {
  90.             result = separatorSpace + pipSpace + separatorSpace + thumbWidth + separatorSpace;
  91.  
  92.             if(useTicks == TICKS_Both)
  93.                 result += pipSpace + separatorSpace;
  94.         }
  95.         else
  96.         {
  97.             result = separatorSpace + thumbWidth + separatorSpace;
  98.         }
  99.     }
  100.     else
  101.     {
  102.         separatorSpace    = 2;
  103.         pipSpace        = SCALE_DOWN(4);
  104.  
  105.         if(useTicks != TICKS_None)
  106.         {
  107.             result = separatorSpace + pipSpace + separatorSpace + thumbHeight + separatorSpace;
  108.  
  109.             if(useTicks == TICKS_Both)
  110.                 result += pipSpace + separatorSpace;
  111.         }
  112.         else
  113.         {
  114.             result = separatorSpace + thumbHeight + separatorSpace;
  115.         }
  116.     }
  117.  
  118.     return(result);
  119. }
  120.  
  121. STATIC BOOL
  122. SliderSetup(struct SliderClassData *sd,WORD Reference,LONG Dimension)
  123. {
  124.     struct DrawInfo *dri = sd->DrawInfo;
  125.     BOOL IsVertical = sd->IsVertical;
  126.     BOOL GotPlanes;
  127.     LONG i;
  128.  
  129.     if(Reference == 0)
  130.         Reference = dri->dri_Font->tf_YSize;
  131.  
  132.     sd->ThumbHeight = (Reference + 1) & ~1;
  133.  
  134.     if(sd->ThumbHeight < 8)
  135.         sd->ThumbHeight = 8;
  136.  
  137.     sd->ThumbWidth = (((sd->ThumbHeight * 1618) / 1000) + 1) & ~1;
  138.  
  139.     if(sd->ThumbWidth < 8)
  140.         sd->ThumbWidth = 8;
  141.  
  142.     sd->ThumbHeight = SCALE_DOWN(sd->ThumbHeight);
  143.  
  144.     if(sd->ThumbHeight < 8)
  145.         sd->ThumbHeight = 8;
  146.  
  147.     InitBitMap(&sd->ThumbBitMap,min(8,dri->dri_Depth),sd->ThumbWidth * 2,sd->ThumbHeight);
  148.  
  149.     GotPlanes = TRUE;
  150.  
  151.     for(i = 0 ; i < sd->ThumbBitMap.Depth ; i++)
  152.     {
  153.         sd->ThumbBitMap.Planes[i] = AllocRaster(sd->ThumbWidth * 2,sd->ThumbHeight);
  154.         if(sd->ThumbBitMap.Planes[i] == NULL)
  155.         {
  156.             GotPlanes = FALSE;
  157.             break;
  158.         }
  159.     }
  160.  
  161.     if(GotPlanes)
  162.     {
  163.         struct RastPort rp;
  164.         UWORD *pens = dri->dri_Pens;
  165.         LONG width,height;
  166.  
  167.         width = height = Dimension;
  168.  
  169.         InitRastPort(&rp);
  170.         rp.BitMap = &sd->ThumbBitMap;
  171.  
  172.         SetRast(&rp,pens[BACKGROUNDPEN]);
  173.  
  174.         SetDrMd(&rp,JAM1);
  175.  
  176.         SetAPen(&rp,pens[SHINEPEN]);
  177.  
  178.         if(IsVertical)
  179.         {
  180.             Move(&rp,0,(sd->ThumbHeight / 2) - 2);
  181.             Draw(&rp,0,0);
  182.             Draw(&rp,sd->ThumbWidth - 2,0);
  183.  
  184.             Move(&rp,0,sd->ThumbHeight - 2);
  185.             Draw(&rp,0,sd->ThumbHeight / 2);
  186.             Draw(&rp,sd->ThumbWidth - 2,sd->ThumbHeight / 2);
  187.  
  188.             SetAPen(&rp,pens[SHADOWPEN]);
  189.  
  190.             Move(&rp,1,(sd->ThumbHeight / 2) - 1);
  191.             Draw(&rp,sd->ThumbWidth - 1,(sd->ThumbHeight / 2) - 1);
  192.             Draw(&rp,sd->ThumbWidth - 1,1);
  193.  
  194.             Move(&rp,1,sd->ThumbHeight - 1);
  195.             Draw(&rp,sd->ThumbWidth - 1,sd->ThumbHeight - 1);
  196.             Draw(&rp,sd->ThumbWidth - 1,(sd->ThumbHeight / 2) + 1);
  197.  
  198.             sd->SeparatorSpace    = 2;
  199.             sd->TickSpace        = SCALE_UP(4);
  200.  
  201.             if(sd->UseTicks != TICKS_None)
  202.             {
  203.                 sd->Width        = sd->SeparatorSpace + sd->TickSpace + sd->SeparatorSpace + sd->ThumbWidth + sd->SeparatorSpace;
  204.                 sd->Height        = height;
  205.  
  206.                 sd->TickTop        = sd->SeparatorSpace;
  207.                 sd->RailTop        = sd->SeparatorSpace + sd->TickSpace + sd->SeparatorSpace + (sd->ThumbWidth / 2) - 2;
  208.                 sd->ThumbTop    = sd->SeparatorSpace + sd->TickSpace + sd->SeparatorSpace;
  209.  
  210.                 if(sd->UseTicks == TICKS_Both)
  211.                     sd->Width += sd->TickSpace + sd->SeparatorSpace;
  212.             }
  213.             else
  214.             {
  215.                 sd->Width        = sd->SeparatorSpace + sd->ThumbWidth + sd->SeparatorSpace;
  216.                 sd->Height        = height;
  217.  
  218.                 sd->TickTop        = sd->SeparatorSpace;
  219.                 sd->RailTop        = sd->SeparatorSpace + (sd->ThumbWidth / 2) - 2;
  220.                 sd->ThumbTop    = sd->SeparatorSpace;
  221.             }
  222.  
  223.             sd->ThumbLast = sd->Height - sd->ThumbHeight;
  224.  
  225.             if(sd->ThumbMax == 0)
  226.                 sd->ThumbLeft = 0;
  227.             else
  228.                 sd->ThumbLeft = (sd->ThumbLast * sd->ThumbPosition) / sd->ThumbMax;
  229.  
  230.             ClipBlit(&rp,0,0,&rp,sd->ThumbWidth,0,sd->ThumbWidth,sd->ThumbHeight,0xC0);
  231.             SetAPen(&rp,pens[FILLPEN]);
  232.  
  233.             RectFill(&rp,sd->ThumbWidth + 1,1,sd->ThumbWidth + sd->ThumbWidth - 2,(sd->ThumbHeight / 2) - 2);
  234.             RectFill(&rp,sd->ThumbWidth + 1,(sd->ThumbHeight / 2) + 1,sd->ThumbWidth + sd->ThumbWidth - 2,sd->ThumbHeight - 2);
  235.         }
  236.         else
  237.         {
  238.             Move(&rp,(sd->ThumbWidth / 2) - 2,0);
  239.             Draw(&rp,0,0);
  240.             Draw(&rp,0,sd->ThumbHeight - 2);
  241.  
  242.             Move(&rp,sd->ThumbWidth - 2,0);
  243.             Draw(&rp,sd->ThumbWidth / 2,0);
  244.             Draw(&rp,sd->ThumbWidth / 2,sd->ThumbHeight - 2);
  245.  
  246.             SetAPen(&rp,pens[SHADOWPEN]);
  247.  
  248.             Move(&rp,(sd->ThumbWidth / 2) - 1,1);
  249.             Draw(&rp,(sd->ThumbWidth / 2) - 1,sd->ThumbHeight - 1);
  250.             Draw(&rp,1,sd->ThumbHeight - 1);
  251.  
  252.             Move(&rp,sd->ThumbWidth - 1,1);
  253.             Draw(&rp,sd->ThumbWidth - 1,sd->ThumbHeight - 1);
  254.             Draw(&rp,(sd->ThumbWidth / 2) + 1,sd->ThumbHeight - 1);
  255.  
  256.             sd->SeparatorSpace    = 2;
  257.             sd->TickSpace        = SCALE_DOWN(4);
  258.  
  259.             if(sd->UseTicks != TICKS_None)
  260.             {
  261.                 sd->Width        = width;
  262.                 sd->Height        = sd->SeparatorSpace + sd->TickSpace + sd->SeparatorSpace + sd->ThumbHeight + sd->SeparatorSpace;
  263.  
  264.                 sd->TickTop        = sd->SeparatorSpace;
  265.                 sd->RailTop        = sd->SeparatorSpace + sd->TickSpace + sd->SeparatorSpace + (sd->ThumbHeight / 2) - 2;
  266.                 sd->ThumbTop    = sd->SeparatorSpace + sd->TickSpace + sd->SeparatorSpace;
  267.  
  268.                 if(sd->UseTicks == TICKS_Both)
  269.                     sd->Height += sd->TickSpace + sd->SeparatorSpace;
  270.             }
  271.             else
  272.             {
  273.                 sd->Width        = width;
  274.                 sd->Height        = sd->SeparatorSpace + sd->ThumbHeight + sd->SeparatorSpace;
  275.  
  276.                 sd->TickTop        = sd->SeparatorSpace;
  277.                 sd->RailTop        = sd->SeparatorSpace + (sd->ThumbHeight / 2) - 2;
  278.                 sd->ThumbTop    = sd->SeparatorSpace;
  279.             }
  280.  
  281.             sd->ThumbLast = sd->Width - sd->ThumbWidth;
  282.  
  283.             if(sd->ThumbMax == 0)
  284.                 sd->ThumbLeft = 0;
  285.             else
  286.                 sd->ThumbLeft = (sd->ThumbLast * sd->ThumbPosition) / sd->ThumbMax;
  287.  
  288.             ClipBlit(&rp,0,0,&rp,sd->ThumbWidth,0,sd->ThumbWidth,sd->ThumbHeight,0xC0);
  289.             SetAPen(&rp,pens[FILLPEN]);
  290.  
  291.             RectFill(&rp,sd->ThumbWidth + 1,1,sd->ThumbWidth + (sd->ThumbWidth / 2) - 2,sd->ThumbHeight - 2);
  292.             RectFill(&rp,sd->ThumbWidth + (sd->ThumbWidth / 2) + 1,1,sd->ThumbWidth + sd->ThumbWidth - 2,sd->ThumbHeight - 2);
  293.         }
  294.     }
  295.     else
  296.     {
  297.         SliderCleanup(sd);
  298.     }
  299.  
  300.     return(GotPlanes);
  301. }
  302.  
  303. STATIC VOID
  304. DrawTicks(struct RastPort *rp,LONG left,LONG top,UWORD *pens,struct SliderClassData *sd)
  305. {
  306.     if(sd->UseTicks != TICKS_None)
  307.     {
  308.         LONG numTicks,maxTicks;
  309.  
  310.         if(sd->IsVertical)
  311.             maxTicks = (sd->Height - sd->ThumbHeight + 4) / 4;
  312.         else
  313.             maxTicks = (sd->Width - sd->ThumbWidth + 4) / 4;
  314.  
  315.         if(sd->NumTicks > 0)
  316.             numTicks = sd->NumTicks;
  317.         else
  318.             numTicks = sd->ThumbMax + 1;
  319.  
  320.         while(numTicks > maxTicks && numTicks > 1)
  321.             numTicks = numTicks / 2;
  322.  
  323.         if(numTicks > 1)
  324.         {
  325.             LONG x,y,i;
  326.  
  327.             if(sd->IsVertical)
  328.             {
  329.                 for(i = 0 ; i < numTicks ; i++)
  330.                 {
  331.                     x = left + sd->TickTop;
  332.                     y = top + (i * (sd->Height - sd->ThumbHeight)) / (numTicks - 1) + (sd->ThumbHeight / 2) - 1;
  333.  
  334.                     SetAPen(rp,pens[SHAD